
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>深入理解 Elasticsearch 架构 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>深入理解 Elasticsearch 架构 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Elasticsearch 的六个核心概念是什么？请简要描述它们。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 索引 (Index): 类似于数据库的表，用于存储相关文档。<br>2. 文档 (Document): 索引中的基本数据单元，通常为 JSON 格式。<br>3. 分片 (Shard): 索引被分割成的多个部分，用于分布式存储。<br>4. 副本 (Replica): 每个分片的拷贝，用于提高可用性和查询性能。<br>5. 节点 (Node): Elasticsearch 集群中的一个实例。<br>6. 集群 (Cluster): 由多个节点组成的集合，共同工作。</div>
          </div>
          <div class="card-source">来源: 1.2 核心概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Elasticsearch 是如何实现快速搜索的？其核心数据结构是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch 使用倒排索引（Inverted Index）来加速搜索。该结构将文档中的每个词映射到包含该词的文档列表，从而在查询时能够快速定位到相关文档。</div>
          </div>
          <div class="card-source">来源: 2.3 倒排索引</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">在一个 Elasticsearch 集群中，节点可以扮演哪些不同的角色？各自的职责是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">节点主要扮演三种角色：<br>1. 主节点 (Master Node): 负责集群管理操作，如创建/删除索引和分配分片。<br>2. 数据节点 (Data Node): 负责存储数据和执行查询。<br>3. 协调节点 (Coordinating Node): 负责接收客户端请求并将其转发到相应的数据节点。</div>
          </div>
          <div class="card-source">来源: 2.1.2 节点角色</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Elasticsearch 的“近实时”搜索特性是如何实现的？涉及到哪两个关键操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch 的近实时搜索是通过两个机制实现的：<br>1. 刷新 (Refresh): 将内存中的文档写入文件系统缓存，使其变得可搜索。<br>2. 提交 (Commit): 将文件系统缓存中的文档写入磁盘，以确保数据的持久性。</div>
          </div>
          <div class="card-source">来源: 2.2 近实时搜索</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">文档中提到了哪三种类型的 Elasticsearch 聚合操作？它们分别用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了三种聚合操作：<br>1. 指标聚合 (Metric Aggregation): 用于计算指标，如平均值(avg)、总和(sum)等。<br>2. 桶聚合 (Bucket Aggregation): 用于将数据分组到不同的“桶”中，如按词条或日期分组。<br>3. 管道聚合 (Pipeline Aggregation): 用于对其他聚合的结果进行二次计算。</div>
          </div>
          <div class="card-source">来源: 3.2 聚合操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">在进行查询优化时，为什么建议使用过滤器（Filter）而不是查询（Query）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为过滤器（Filter）不会计算相关性分数，其性能通常优于查询（Query）。这使得它在只需要进行“是/否”匹配的场景下效率更高。</div>
          </div>
          <div class="card-source">来源: 4.2 查询优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">在 Elasticsearch 中，分片（Shard）和副本（Replica）的数量在创建索引后是否都可以修改？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不可以。分片的数量在创建索引时指定，之后不能更改。而副本的数量可以动态调整，以适应可用性或查询负载的变化。</div>
          </div>
          <div class="card-source">来源: 2.1.1 分片与副本</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">针对 Elasticsearch 的硬件与配置，文档给出了哪条关于 JVM 内存配置的关键建议？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">建议将 JVM 堆内存设置为物理内存的 50%，但总大小不要超过 32GB。</div>
          </div>
          <div class="card-source">来源: 4.3 硬件与配置优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">为了防止数据丢失，Elasticsearch 的最佳实践中推荐使用什么功能进行数据备份？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">推荐使用快照（Snapshot）功能定期备份 Elasticsearch 数据，并将备份存储到远程存储系统（如 S3、HDFS）中。</div>
          </div>
          <div class="card-source">来源: 6.3 数据备份与恢复</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
